/* Inclusão de bibliotecas e definição de espaço de nome */
#include<iostream>
#include <stdlib.h>
#include <stdio.h>
#include <vector>
#include <string.h>
using namespace std;

typedef struct 
{
  int custo;
  int lucro;
}Prato;

int nDias, qtoPratos, orcamento;
int indicePratoAnterior[51][102][25];
float lucroOtimo[51][102][25];

bool jaVistou[51][102][25];

vector<Prato> opcoes;

Prato constroiPrato(int custo, int lucro)
{
  Prato aux; 
  aux.custo = custo;
  aux.lucro = lucro;
  return aux;
}    

//imprime as opcoes
void imprimeOpcoes(int quantidade, vector<Prato> &opcoes){


    for ( int i = 0; i < quantidade; i++ ) {
         printf("[%d].custo = %d\n",i,opcoes[i].custo);
         printf("[%d].lucro= %d\n",i,opcoes[i].lucro);
    }

}

vector<Prato> le_pratos(vector<Prato> opcoes) 
{
  int custo, lucro;
  scanf("%d %d \n", &custo, &lucro);
  opcoes.push_back(constroiPrato(custo, lucro)); 
  return opcoes;
}

int encontraMaisBarato()
{
  int cheapest = 0;
  for(int i = 0; i<qtoPratos; i++) 
    if(opcoes[cheapest].custo > opcoes[i].custo)
      cheapest = i;
  return cheapest;
}

/* Função que executa algoritmo de programação dinâmica */

void cardapioDinamico()
{
    memset(jaVistou,false,sizeof jaVistou);
    for(int j=0;j<=orcamento;j++)
        for(int i=1;i<=qtoPratos;i++)
            for(int l=0;l<=nDias;l++)
                lucroOtimo[i][j][l]=0,indicePratoAnterior[i][j][1]=0;
    for(int i=1;i<=qtoPratos;i++)
            jaVistou[i][orcamento][0]=true;
    float max1=0;int g,h;
    for(int b=orcamento;b>=0;b--)
    {
        for(int i=1;i<=qtoPratos;i++)
        {
            for(int l=0;l<nDias;l++)
            {
                for(int j=1;j<=qtoPratos;j++)
                {
                    if(jaVistou[i][b][l] && b>=opcoes[j-1].custo )
                    {
                        float v=opcoes[j-1].lucro;
                        if(j==i)
                        {
                            if(l>0)
                                v/=2.0;
                            if(l>1 && indicePratoAnterior[i][b][l]==i)
                                v=0.0;
                        }
                        if(lucroOtimo[j][b-opcoes[j-1].custo][l+1]<lucroOtimo[i][b][l]+v)
                        {
                            lucroOtimo[j][b-opcoes[j-1].custo][l+1]=lucroOtimo[i][b][l]+v;
                            jaVistou[j][b-opcoes[j-1].custo][l+1]=true;
                            if(l>0)
                                indicePratoAnterior[j][b-opcoes[j-1].custo][l+1]=i;
                        }
                        if(l+1==nDias && jaVistou[j][b-opcoes[j-1].custo][l+1])
                            if(max1<lucroOtimo[j][b-opcoes[j-1].custo][l+1])
                                max1=lucroOtimo[j][b-opcoes[j-1].custo][l+1],g=j,h=b-opcoes[j-1].custo;
                    }
                }
            }
        }
    }
    printf("%.1lf\n",max1);
    int prev;
    if(max1!=0)
    {
        printf("%d ",g);
        int f=nDias;
        while(--f)
        {
            printf("%d ",indicePratoAnterior[g][h][nDias]);
            int tempg=g;
            g=indicePratoAnterior[g][h][nDias],h+=opcoes[tempg-1].custo,nDias--;
        }
    }
    printf("\n");
}



int main(int argc, char *argv[]){

  while(scanf("%d %d %d\n", &nDias, &qtoPratos, &orcamento))
  {

    if(nDias==0 && qtoPratos==0 && orcamento ==0) return 0;

    //limpa os pratos da ultima instancia
    opcoes.clear();

    //le pontos 
    for(int i = 0; i<qtoPratos; i++)
      opcoes= le_pratos(opcoes);

    // Verifica a possibilidade inicial de fazer um menu
    if((nDias * opcoes[encontraMaisBarato()].custo) > orcamento) 
      printf("0.0\n\n");
    else
      cardapioDinamico();
  }
  return 0;
}
